package com.bbs.utils;

import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Position;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;

/**
 * @author: ZackYoung
 * @time: 2020/11/15
 */
public class PictureUtil {
    /**
     * 指定大小进行缩放 若图片横比width小，高比height小，不变 若图片横比width小，高比height大，高缩小到height，图片比例不变
     * 若图片横比width大，高比height小，横缩小到width，图片比例不变
     * 若图片横比width大，高比height大，图片按比例缩小，横为width或高为height
     *
     * @param source
     *            输入源
     * @param output
     *            输出源
     * @param width
     *            宽
     * @param height
     *            高
     * @param suffix
     * 			  图片后缀名：jpg、png
     * @throws IOException
     */
    public static void imgThumb(String source, String output, int width,
                                int height, float quality, String suffix) throws IOException {
        Thumbnails.of(source).size(width, height).outputQuality(quality)
                .outputFormat(suffix).toFile(output);
    }

    /**
     *
     * @Title: imgThumbOutputStream
     * @Description: 图片压缩转换成输出流进行输出
     * @param: @param source
     * @param: @param width
     * @param: @param height
     * @param: @param quality
     * @param: @param suffix
     * @param: @return
     * @param: @throws IOException
     * @return: OutputStream
     * @throws
     */
    public static OutputStream imgThumbOutputStream(String source, int width,
                                                    int height, float quality , String suffix) throws IOException {

        OutputStream os = new ByteArrayOutputStream();
        Thumbnails.of(source).size(width, height).outputQuality(quality)
                .outputFormat(suffix).toOutputStream(os);
        return os;
    }

    /**
     * 指定大小进行缩放
     *
     * @param source
     *            输入源
     * @param output
     *            输出源
     * @param width
     *            宽
     * @param height
     *            高
     * @param suffix
     *            图片后缀名称
     * @throws IOException
     */
    public static void imgThumb(File source, String output, int width,
                                int height, float quality, String suffix) throws IOException {
        Thumbnails.of(source).size(width, height).outputQuality(quality)
                .outputFormat(suffix).toFile(output);
    }

    /**
     * 按照比例进行缩放(图片路径)
     *
     * @param source
     *            输入源
     * @param output
     *            输出源
     * @param scale
     *            缩放百分比
     * @param suffix
     *            图片后缀名
     * @throws IOException
     */
    public static void imgScale(String source, String output, double scale, String suffix)
            throws IOException {
        Thumbnails.of(source).scale(scale).outputFormat(suffix).toFile(output);
    }

    /**
     * 按照比例进行缩放(图片文件)
     *
     * @param source
     *            输入源
     * @param output
     *            输出源
     * @param scale
     *            缩放百分比
     * @param suffix
     *            图片后缀名
     * @throws IOException
     */
    public static void imgScale(File source, String output, double scale, String suffix)
            throws IOException {
        Thumbnails.of(source).scale(scale).outputFormat("jpg").toFile(output);
    }

    /**
     * 按照比例进行缩放(输出流)
     *
     * @param source
     *            输入源
     * @param scale
     *            缩放百分比
     * @param suffix
     *            图片后缀名
     * @throws IOException
     */
    public static OutputStream imgScaleOutputStream(File source, double scale, String suffix)
            throws IOException {
        OutputStream os = new ByteArrayOutputStream();
        Thumbnails.of(source).scale(scale).outputFormat(suffix)
                .toOutputStream(os);
        return os;
    }

    /**
     * 按照比例进行缩放(字节数组)
     *
     * @param source
     *            输入字节数组
     * @param scale
     *            缩放百分比
     * @param suffix
     *            图片后缀名
     * @throws IOException
     */
    public static byte[] imgScaleByte(byte[] source, double scale, String suffix)
            throws IOException {

        ByteArrayOutputStream os = new ByteArrayOutputStream();
        InputStream input = new ByteArrayInputStream(source);
        Thumbnails.of(input).scale(scale).outputFormat(suffix)
                .toOutputStream(os);
        return os.toByteArray();
    }

    /**
     * 不按照比例，指定大小进行缩放(图片文件路径)
     *
     * @param source
     *            输入源
     * @param output
     *            输出源
     * @param width
     *            宽
     * @param height
     *            高
     * @param keepAspectRatio
     *            默认是按照比例缩放的,值为false 时不按比例缩放
     * @param suffix
     *            图片后缀名
     */
    public static void imgNoScale(String source, String output, int width,
                                  int height, boolean keepAspectRatio, String suffix) throws IOException {
        Thumbnails.of(source).size(width, height)
                .keepAspectRatio(keepAspectRatio).outputFormat(suffix)
                .toFile(output);
    }

    /**
     * 不按照比例，指定大小进行缩放(图片文件)
     *
     * @param source
     *            输入源
     * @param output
     *            输出源
     * @param width
     *            宽
     * @param height
     *            高
     * @param keepAspectRatio
     *            默认是按照比例缩放的,值为false 时不按比例缩放
     * @param suffix
     *            图片后缀名
     */
    public static void imgNoScale(File source, String output, int width,
                                  int height, boolean keepAspectRatio, String suffix) throws IOException {
        Thumbnails.of(source).size(width, height)
                .keepAspectRatio(keepAspectRatio).outputFormat(suffix)
                .toFile(output);
    }

    /**
     * 旋转 ,正数：顺时针 负数：逆时针(图片文件路径)
     *
     * @param source
     *            输入源
     * @param output
     *            输出源
     * @param width
     *            宽
     * @param height
     *            高
     * @param rotate
     *            角度
     * @param suffix
     *            图片后缀名
     */
    public static void imgRotate(String source, String output, int width,
                                 int height, double rotate, String suffix) throws IOException {
        Thumbnails.of(source).size(width, height).rotate(rotate)
                .outputFormat(suffix).toFile(output);
    }

    /**
     * 旋转 ,正数：顺时针 负数：逆时针(图片文件)
     *
     * @param source
     *            输入源
     * @param output
     *            输出源
     * @param width
     *            宽
     * @param height
     *            高
     * @param rotate
     *            角度
     * @param suffix
     *            图片后缀名
     */
    public static void imgRotate(File source, String output, int width,
                                 int height, double rotate, String suffix) throws IOException {
        Thumbnails.of(source).size(width, height).rotate(rotate)
                .outputFormat(suffix).toFile(output);
    }

    /**
     * 水印(图片文件路径)
     *
     * @param source
     *            输入源
     * @param output
     *            输入源
     * @param width
     *            宽
     * @param height
     *            高
     * @param position
     *            水印位置 Positions.BOTTOM_RIGHT o.5f
     * @param watermark
     *            水印图片地址
     * @param transparency
     *            透明度 0.5f
     * @param quality
     *            图片质量 0.8f
     * @param suffix
     *            图片后缀名
     */
    public static void imgWatermark(String source, String output, int width,
                                    int height, Position position, String watermark,
                                    float transparency, float quality, String suffix) throws IOException {
        Thumbnails
                .of(source)
                .size(width, height)
                .watermark(position, ImageIO.read(new File(watermark)),
                        transparency).outputQuality(0.8f).outputFormat(suffix)
                .toFile(output);
    }

    /**
     * 水印(图片文件)
     *
     * @param source
     *            输入源
     * @param output
     *            输入源
     * @param width
     *            宽
     * @param height
     *            高
     * @param position
     *            水印位置 Positions.BOTTOM_RIGHT o.5f
     * @param watermark
     *            水印图片地址
     * @param transparency
     *            透明度 0.5f
     * @param quality
     *            图片质量 0.8f
     * @param suffix
     *            图片后缀名称
     */

    public static void imgWatermark(File source, String output, int width,
                                    int height, Position position, String watermark,
                                    float transparency, float quality, String suffix) throws IOException {
        Thumbnails
                .of(source)
                .size(width, height)
                .watermark(position, ImageIO.read(new File(watermark)),
                        transparency).outputQuality(0.8f).outputFormat(suffix)
                .toFile(output);
    }

    /**
     * 裁剪图片(图片文件路径)
     *
     * @param source
     *            输入源
     * @param output
     *            输出源
     * @param position
     *            裁剪位置
     * @param x
     *            裁剪区域x
     * @param y
     *            裁剪区域y
     * @param width
     *            宽
     * @param height
     *            高
     * @param keepAspectRatio
     *            默认是按照比例缩放的,值为false 时不按比例缩放
     * @param suffix
     *            图片后缀名成
     */
    public static void imgSourceRegion(String source, String output,
                                       Position position, int x, int y, int width, int height,
                                       boolean keepAspectRatio, String suffix) throws IOException {
        Thumbnails.of(source).sourceRegion(position, x, y).size(width, height)
                .keepAspectRatio(keepAspectRatio).outputFormat(suffix)
                .toFile(output);
    }


    /**
     * 裁剪图片(图片文件)
     *
     * @param source
     *            输入源
     * @param output
     *            输出源
     * @param position
     *            裁剪位置
     * @param x
     *            裁剪区域x
     * @param y
     *            裁剪区域y
     * @param width
     *            宽
     * @param height
     *            高
     * @param keepAspectRatio
     *            默认是按照比例缩放的,值为false 时不按比例缩放
     * @param suffix
     *            图片后缀名成
     */
    public static void imgSourceRegion(File source, String output,
                                       Position position, int x, int y, int width, int height,
                                       boolean keepAspectRatio, String suffix) throws IOException {
        Thumbnails.of(source).sourceRegion(position, x, y).size(width, height)
                .keepAspectRatio(keepAspectRatio).outputFormat(suffix)
                .toFile(output);
    }

    /**
     * 按坐标裁剪(图片路径)
     *
     * @param source
     *            输入源
     * @param output
     *            输出源
     * @param x
     *            起始x坐标
     * @param y
     *            起始y坐标
     * @param x1
     *            结束x坐标
     * @param y1
     *            结束y坐标
     * @param width
     *            宽
     * @param height
     *            高
     * @param keepAspectRatio
     *            默认是按照比例缩放的,值为false 时不按比例缩放
     */
    public static void imgSourceRegion(String source, String output, int x,
                                       int y, int x1, int y1, int width, int height,
                                       boolean keepAspectRatio) throws IOException {
        Thumbnails.of(source).sourceRegion(x, y, x1, y1).size(width, height)
                .keepAspectRatio(keepAspectRatio).toFile(output);
    }

    /**
     * 按坐标裁剪(图片文件)
     *
     * @param source
     *            输入源
     * @param output
     *            输出源
     * @param x
     *            起始x坐标
     * @param y
     *            起始y坐标
     * @param x1
     *            结束x坐标
     * @param y1
     *            结束y坐标
     * @param width
     *            宽
     * @param height
     *            高
     * @param keepAspectRatio
     *            默认是按照比例缩放的,值为false 时不按比例缩放
     * @param suffix
     *            图片后缀名称
     */
    public static void imgSourceRegion(File source, String output, int x,
                                       int y, int x1, int y1, int width, int height,
                                       boolean keepAspectRatio, String suffix) throws IOException {
        Thumbnails.of(source).sourceRegion(x, y, x1, y1).size(width, height)
                .keepAspectRatio(keepAspectRatio).outputFormat(suffix)
                .toFile(output);
    }

    /**
     * 转化图像格式(图片路径)
     *
     * @param source
     *            输入源
     * @param output
     *            输出源
     * @param width
     *            宽
     * @param height
     *            高
     * @param format
     *            图片类型，gif、png、jpg
     */
    public static void imgFormat(String source, String output, int width,
                                 int height, String format) throws IOException {
        Thumbnails.of(source).size(width, height).outputFormat(format)
                .toFile(output);
    }

    /**
     * 转化图像格式(图片路径)
     *
     * @param source
     *            输入源
     * @param output
     *            输出源
     * @param width
     *            宽
     * @param height
     *            高
     * @param format
     *            图片类型，gif、png、jpg
     * @param suffix
     *            图片后缀名称
     */
    public static void imgFormat(File source, String output, int width,
                                 int height, String format, String suffix) throws IOException {
        Thumbnails.of(source).size(width, height).outputFormat(format)
                .outputFormat(suffix).toFile(output);
    }

    /**
     * 输出到OutputStream(图片路径)
     *
     * @param source
     *            输入源
     * @param output
     *            输出源
     * @param width
     *            宽
     * @param height
     *            高
     * @param suffix
     *            图片后缀名称
     * @return toOutputStream(流对象)
     */
    public static OutputStream imgOutputStream(String source, String output,
                                               int width, int height, String suffix) throws IOException {
        OutputStream os = new FileOutputStream(output);
        Thumbnails.of(source).size(width, height).outputFormat(suffix)
                .toOutputStream(os);
        return os;
    }

    /**
     * 输出到OutputStream(图片文件)
     *
     * @param source
     *            输入源
     * @param output
     *            输出源
     * @param width
     *            宽
     * @param height
     *            高
     * @param suffix
     *            图片后缀名称
     * @return toOutputStream(流对象)
     */
    public static OutputStream imgOutputStream(File source, String output,
                                               int width, int height, String suffix) throws IOException {
        OutputStream os = new FileOutputStream(output);
        Thumbnails.of(source).size(width, height).outputFormat(suffix)
                .toOutputStream(os);
        return os;
    }

    /**
     * 输出到BufferedImage(图片文件路径)
     *
     * @param source
     *            输入源
     * @param output
     *            输出源
     * @param width
     *            宽
     * @param height
     *            高
     * @param format
     *            图片类型，gif、png、jpg
     * @param suffix
     *            图片后缀名称
     * @return BufferedImage
     */
    public static BufferedImage imgBufferedImage(String source, String output,
                                                 int width, int height, String format, String suffix) throws IOException {
        BufferedImage buf = Thumbnails.of(source).size(width, height)
                .outputFormat(suffix).asBufferedImage();
        ImageIO.write(buf, format, new File(output));
        return buf;
    }

    /**
     * 输出到BufferedImage(图片文件)
     *
     * @param source
     *            输入源
     * @param output
     *            输出源
     * @param width
     *            宽
     * @param height
     *            高
     * @param format
     *            图片类型，gif、png、jpg
     * @param suffix
     *            图片后缀名称
     * @return BufferedImage
     */
    public static BufferedImage imgBufferedImage(File source, String output,
                                                 int width, int height, String format, String suffix) throws IOException {
        BufferedImage buf = Thumbnails.of(source).size(width, height)
                .outputFormat(suffix).asBufferedImage();
        ImageIO.write(buf, format, new File(output));
        return buf;
    }
}
